<!DOCTYPE HTML>
<meta charset=utf-8>
<title>LongTask Timing: long tasks in various containers</title>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/utils.js"></script>
<h1>Longtasks in iframe, frame, object, and embed</h1>
<div id="log"></div>
<script>
function Container(name, src) {
    this.name = name;
    this.src = src;
}
const Containers = [
    new Container('iframe', 'src'),
    new Container('frame', 'src'),
    new Container('object', 'data'),
    new Container('embed', 'src'),
];
Containers.forEach(container => {
  promise_test(async t => {
    assert_implements(window.PerformanceLongTaskTiming, 'Longtasks are not supported.');
    const initialTime = performance.now();
    return new Promise(resolve => {
      const observer = new PerformanceObserver(t.step_func(entryList => {
        const entries = entryList.getEntries();
        assert_equals(entries.length, 1,
          'Exactly one entry is expected.');
        const longtask = entries[0];
        assert_equals(longtask.entryType, 'longtask');
        if (longtask.name == 'self' ||
            longtask.name == 'multiple-contexts' ||
            longtask.name == 'unknown')
          return;
        checkLongTaskEntry(longtask, 'same-origin-descendant');
        // Assert the TaskAttributionTiming entry in attribution.
        assert_equals(longtask.attribution.length, 1,
          'Exactly one attribution entry is expected');
        const attribution = longtask.attribution[0];
        assert_equals(attribution.entryType, 'taskattribution');
        assert_equals(attribution.name, 'unknown');
        assert_equals(attribution.duration, 0);
        assert_equals(attribution.startTime, 0);
        assert_equals(attribution.containerId, container.name + '-id');
        assert_equals(attribution.containerName, container.name + '-name');
        assert_equals(attribution.containerSrc, 'resources/subframe-with-longtask.html');
        observer.disconnect();
        resolve();
      }));
      observer.observe({entryTypes: ['longtask']});
      const containerObject = document.createElement(container.name);
      containerObject.id = container.name + '-id';
      containerObject.name = container.name + '-name';
      containerObject[container.src] = 'resources/subframe-with-longtask.html';
      document.body.appendChild(containerObject);
    });
  }, `Performance longtask entries in ${container.name} are observable in parent.`);
});
</script>
</body>
